/**
 * 
 */
package com.peycash.persistencia.dao.impl;

import java.util.Date;
import java.util.List;

import org.hibernate.Criteria;
import org.hibernate.criterion.MatchMode;
import org.hibernate.criterion.Projections;
import org.hibernate.criterion.Restrictions;
import org.springframework.stereotype.Repository;
import org.springframework.util.CollectionUtils;

import com.peycash.dominio.Colonias;
import com.peycash.dominio.Municipios;
import com.peycash.persistencia.PersistenciaException;
import com.peycash.persistencia.dao.ColoniaDAO;

/**
 * @author JAMARO
 *
 */
@Repository
public class ColoniaDAOImpl extends BaseDAOImpl<Colonias, Long> implements
		ColoniaDAO {
	

	@Override
	public long findIdColoniaByNombreAndCP(String nombre, String cp) throws PersistenciaException{
		try{
			Criteria criteria = getSessionFactory().getCurrentSession().createCriteria(Colonias.class);
			criteria.add(Restrictions.like("cp", cp));
			criteria.add(Restrictions.ilike("nombre", nombre));
			List<Colonias> list = criteria.list();
			if(CollectionUtils.isEmpty(list)){
				Colonias colonia = new Colonias();
				colonia.setCp(cp);
				colonia.setFechaModificacion(new Date());
				colonia.setNombre(nombre);
				int idMunicipio = this.getMunicipio(cp);
				Municipios municipios = new Municipios();
				municipios.setIdMunicipio(idMunicipio);
				colonia.setMunicipios(municipios);
				long pk = this.save(colonia);
				return pk;
			}else{
				Colonias resultado = list.get(0);
				return resultado.getIdColonia();
			}
		}catch(Exception e){
			throw new PersistenciaException("Error en xx:"+e.getMessage(), e);
		}
	}
	
	@Override
	public List<Colonias> findByNombre(String nombre) throws PersistenciaException{
		try{
			Criteria criteria = getSessionFactory().getCurrentSession().createCriteria(Colonias.class);
			criteria.add(Restrictions.ilike("nombre", nombre, MatchMode.START));
			List<Colonias> list = criteria.list();
			return list;
		}catch(Exception e){
			throw new PersistenciaException("Error en findByNombre:"+e.getMessage(), e);
		}
	}
	
	@Override
	public List<String> findNombresCoincidencias(String nombre) throws PersistenciaException{
		try{
			Criteria criteria = getSessionFactory().getCurrentSession().createCriteria(Colonias.class);
			criteria.add(Restrictions.ilike("nombre", nombre, MatchMode.START));
			criteria.setProjection(Projections.property("nombre"));
			List<String> list = criteria.list();
			return list;
		}catch(Exception e){
			throw new PersistenciaException("Error en findByNombre:"+e.getMessage(), e);
		}
	}
	
	@Override
	public boolean existsCP(String cp) throws PersistenciaException{
		try{
			Criteria criteria = getSessionFactory().getCurrentSession().createCriteria(Colonias.class);
			criteria.add(Restrictions.like("cp", cp));
			List<Colonias> list = criteria.list();
			if(CollectionUtils.isEmpty(list)){
				return false;
			}
			return true;
		}catch(Exception e){
			throw new PersistenciaException("Error en existsCP:"+e.getMessage(), e);
		}
	}
	
	@Override
	public int getMunicipio(String cp) throws PersistenciaException{
		try{
			Criteria criteria = getSessionFactory().getCurrentSession().createCriteria(Colonias.class);
			criteria.add(Restrictions.like("cp", cp));
			List<Colonias> list = criteria.list();
			Colonias col = list.get(0);
			int idMunicipio = col.getMunicipios().getIdMunicipio();
			return idMunicipio;
		}catch(Exception e){
			throw new PersistenciaException("Error en getMunicipio:"+e.getMessage(), e);
		}
	}
	
}
